package com.sprouting.ops.service;


import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sprouting.ops.dao.DromaraFileStorageDao;
import com.sprouting.ops.dao.OpsDeployToolDao;
import com.sprouting.ops.dao.OpsToolDao;
import com.sprouting.ops.interfaces.ConstantBase;
import com.sprouting.ops.model.DromaraFileStorage;
import com.sprouting.ops.model.OpsDeployTool;
import com.sprouting.ops.model.qo.OpsDeployToolQo;
import com.sprouting.ops.model.vo.DeployPortVo;
import com.sprouting.ops.model.vo.OpsDeployToolVo;
import com.sprouting.ops.model.vo.OpsToolVo;
import com.sprouting.ops.utils.EntityTool;
import org.springframework.stereotype.Service;
import lombok.extern.slf4j.Slf4j;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 部署信息-工具(OpsDeployTool)(OPS_DEPLOY_TOOL) 表服务实现类
 *
 * @author ：lx（长沙麓谷）
 * @date 创建时间：2025-07-22 16:38:41
 */
@Service
@Slf4j
public class OpsDeployToolService extends ServiceImpl<OpsDeployToolDao, OpsDeployTool> {

    @Resource
    private OpsDeployToolDao opsDeployToolDao;
    @Resource
    private DromaraFileStorageDao dromaraFileStorageDao;
    @Resource
    private OpsToolDao opsToolDao;

    /**
     * 分页查询 部署信息-工具
     * @param page 分页参数
     * @param query 查询参数
     * @return
     */
    public Page<OpsDeployToolVo> getListPage(Page page, OpsDeployToolQo query){
        Page<OpsDeployToolVo> listPage = opsDeployToolDao.getListPage(page, query);
        if (CollUtil.isEmpty(listPage.getRecords())){
            return listPage;
        }

        List<OpsDeployToolVo> list = listPage.getRecords();

        // 插入工具信息
        List<String> toolIdList = list.stream().map(OpsDeployToolVo::getToolId).collect(Collectors.toList());
        List<OpsToolVo> toolList = opsToolDao.getByBatchId(toolIdList);
        Map<String, OpsToolVo> map = EntityTool.toMap(toolList, OpsToolVo::getId);

        for (OpsDeployToolVo vo : list) {
            vo.setTool(map.get(vo.getToolId()));
        }

        return listPage;
    }

    /**
     * 删除部署信息-工具
     * @param id 部署id
     * @param bindList 图片信息
     */
    @Transactional(rollbackFor = Exception.class)
    public void delOpsDeployTool(String id, List<DromaraFileStorage> bindList) {
        opsDeployToolDao.deleteById(id);

        // 删除图片
        if (CollUtil.isNotEmpty(bindList)){
            for (DromaraFileStorage dromaraFileStorage : bindList) {
                dromaraFileStorage.setTempFile(ConstantBase.TempFile.PRODUCTION_DEL);
                dromaraFileStorage.setDelTime(new Date());
                dromaraFileStorageDao.updateById(dromaraFileStorage);
            }
        }
    }

    /**
     * 保存部署信息-工具
     * @param bo 工具
     * @param list 工具使用到的图片
     */
    @Transactional(rollbackFor = Exception.class)
    public void saveOpsDeployTool(OpsDeployTool bo, List<DromaraFileStorage> list) {
        opsDeployToolDao.insert(bo);
        // md 图片
        if (CollUtil.isNotEmpty(list)){
            for (DromaraFileStorage dromaraFileStorage : list) {
                dromaraFileStorageDao.updateById(dromaraFileStorage);
            }
        }
    }

    /**
     * 更新部署信息-工具
     * @param bo 工具
     * @param list 工具使用到的图片
     */
    public void updOpsDeployTool(OpsDeployTool bo, List<DromaraFileStorage> list) {
        opsDeployToolDao.updateById(bo);

        if (CollUtil.isNotEmpty(list)){
            for (DromaraFileStorage dromaraFileStorage : list) {
                dromaraFileStorageDao.updateById(dromaraFileStorage);
            }
        }
    }

    /**
     * 根据计算机找到端口等部署信息
     * @param computerServerId 计算机id
     * @return
     */
    public List<DeployPortVo> getByComputerServerId(String computerServerId) {
        return opsDeployToolDao.getByComputerServerId(computerServerId);
    }
}
